package com.special.threademo.common.pdf;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.UUID;


/**
 * @author LiuYC
 * @version 1.0.0
 * @create 2020-12-29 20:47
 */

/**
 * pdf的简单得demo
 */
public class TestPDFDemo1 {
    public static void main(String[] args) throws FileNotFoundException, DocumentException {

        // 1.新建document对象
        Document document = new Document();

        // 2.建立一个书写器(Writer)与document对象关联，通过书写器(Writer)可以将文档写入到磁盘中。
        // 创建 PdfWriter 对象 第一个参数是对文档对象的引用，第二个参数是文件的实际名称，在该名称中还会给出其输出路径。
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C://Users/liudaka/Desktop/test.pdf"));

        // 3.打开文档
        document.open();

        // 4.添加一个内容段落
        document.add(new Paragraph("Hello World!"));

        // 5.关闭文档
        document.close();

    }

    /**
     * 给PDF文件设置文件属性
     */
    static class demo2 {
        public static void main(String[] args) throws FileNotFoundException, DocumentException {

            //创建文件
            Document document = new Document();
            //建立一个书写器
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C://Users/liudaka/Desktop/test2.pdf"));
            //打开文件
            document.open();
            //添加内容
            document.add(new Paragraph("Some content here"));

            //设置属性
            //标题
            document.addTitle("this is a title");
            //作者
            document.addAuthor("H__D");
            //主题
            document.addSubject("this is subject");
            //关键字
            document.addKeywords("Keywords");
            //创建时间
            document.addCreationDate();
            //应用程序
            document.addCreator("hd.com");

            //关闭文档
            document.close();
            //关闭书写器
            writer.close();
        }
    }

    /**
     * PDF中添加图片
     */
    static class demos {
        public static void main(String[] args) throws DocumentException, IOException {

            //创建文件
            Document document = new Document();
            //建立一个书写器
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C://Users/liudaka/Desktop/test3.pdf"));
            //打开文件
            document.open();
            //添加内容
            document.add(new Paragraph("HD content here"));

            //图片1
            Image image1 = Image.getInstance("C://Users/liudaka/Desktop/微信图片_20201223163306.JPG");
            //设置图片位置的x轴和y周
            image1.setAbsolutePosition(100f, 550f);
            //设置图片的宽度和高度
            image1.scaleAbsolute(200, 200);
            //将图片1添加到pdf文件中
            document.add(image1);

            //图片2
            Image image2 = Image.getInstance(new URL("http://static.cnblogs.com/images/adminlogo.gif"));
            //将图片2添加到pdf文件中
            document.add(image2);

            //关闭文档
            document.close();
            //关闭书写器
            writer.close();
        }
    }

    /**
     * PDF中创建表格
     */
    static class demo4 {
        public static void main(String[] args) throws DocumentException, FileNotFoundException {
            //创建文件
            Document document = new Document();
            //建立一个书写器
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C://Users/liudaka/Desktop/test4.pdf"));
            //打开文件
            document.open();
            //添加内容
            document.add(new Paragraph("HD content here"));

            // 3列的表.
            PdfPTable table = new PdfPTable(3);
            table.setWidthPercentage(100); // 宽度100%填充
            table.setSpacingBefore(10f); // 前间距
            table.setSpacingAfter(10f); // 后间距

            ArrayList<PdfPRow> listRow = table.getRows();
//        List<PdfPRow> listRow = table.getRows();
            //设置列宽
            float[] columnWidths = {1f, 2f, 3f};
            table.setWidths(columnWidths);

            //行1
            PdfPCell cells1[] = new PdfPCell[3];
            PdfPRow row1 = new PdfPRow(cells1);

            //单元格
            cells1[0] = new PdfPCell(new Paragraph("111"));//单元格内容
            cells1[0].setBorderColor(BaseColor.BLUE);//边框验证
            cells1[0].setPaddingLeft(20);//左填充20
            cells1[0].setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中
            cells1[0].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中

            cells1[1] = new PdfPCell(new Paragraph("222"));
            cells1[2] = new PdfPCell(new Paragraph("333"));

            //行2
            PdfPCell cells2[] = new PdfPCell[3];
            PdfPRow row2 = new PdfPRow(cells2);
            cells2[0] = new PdfPCell(new Paragraph("444"));

            //把第一行添加到集合
            listRow.add(row1);
            listRow.add(row2);
            //把表格添加到文件中
            document.add(table);

            //关闭文档
            document.close();
            //关闭书写器
            writer.close();
        }
    }

    /**
     * PDF中创建列表
     */
    static class demo5 {
        public static void main(String[] args) throws DocumentException, FileNotFoundException {
            //创建文件
            Document document = new Document();
            //建立一个书写器
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C://Users/liudaka/Desktop/test5.pdf"));
            //打开文件
            document.open();
            //添加内容
            document.add(new Paragraph("HD content here"));

            //添加有序列表
            List orderedList = new List(List.ORDERED);
            orderedList.add(new ListItem("Item one"));
            orderedList.add(new ListItem("Item two"));
            orderedList.add(new ListItem("Item three"));
            document.add((Element) orderedList);

            //关闭文档
            document.close();
            //关闭书写器
            writer.close();
        }
    }

    /**
     * PDF中设置样式/格式化输出，输出中文内容，必须引入itext-asian.jar
     * <p>
     * 1、使用iTextAsian.jar中的字体
     * BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
     * 2、使用Windows系统字体(TrueType)
     * BaseFont.createFont("C:/WINDOWS/Fonts/SIMYOU.TTF", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
     * 3、使用资源字体(ClassPath)
     * BaseFont.createFont("/SIMYOU.TTF", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
     * <p>
     * 第2、三种方式使用的字体多一些，但是需要和实际资源绑定，在实际项目中可以将一些字体库和项目打包在一起，下面我们以iTextAsian中自带的字体为例说明如何输出中文：
     */

    static class demo6 {
        public static void main(String[] args) throws DocumentException, IOException {
            //创建文件
            Document document = new Document();
            //建立一个书写器
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C://Users/liudaka/Desktop/test6.pdf"));
            //打开文件
            document.open();

            //中文字体,解决中文不能显示问题
            BaseFont bfChinese = BaseFont.createFont("C:/WINDOWS/Fonts/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
//            BaseFont bfChinese = BaseFont.createFont("Helvetica", "Cp1252", BaseFont.NOT_EMBEDDED);

            //蓝色字体
            Font blueFont = new Font(bfChinese);
            blueFont.setColor(BaseColor.BLUE);
            //绿色字体
            Font greenFont = new Font(bfChinese);
            greenFont.setColor(BaseColor.GREEN);
            //红色字体
            Font redFont = new Font(bfChinese);
            greenFont.setColor(BaseColor.RED);
            //黑色字体
            Font blackFont = new Font(bfChinese);
            greenFont.setColor(BaseColor.BLACK);
            //段落文本
            Paragraph paragraphBlue = new Paragraph("中国人的填项我们接下来的任务就是按照最新的形式逻辑进行最为严格的方式进行着：", blueFont);
//            对齐
            paragraphBlue.setAlignment(9);
//            左间距
            paragraphBlue.setIndentationLeft(452);
//            之前的空格
            paragraphBlue.setSpacingAfter(30);
            Paragraph paragraphBlue2 = new Paragraph("paragraphOne blue front", blueFont);
            document.add(paragraphBlue);
            document.add(paragraphBlue2);
            //创建章节
            Paragraph chapterTitle = new Paragraph("段落标题xxxx", greenFont);
            Chapter chapter1 = new Chapter(chapterTitle, 1);
            chapter1.setNumberDepth(0);

            Paragraph sectionTitle = new Paragraph("部分标题是这样的", greenFont);
            Section section1 = chapter1.addSection(sectionTitle);

            Paragraph sectionContent = new Paragraph("部分内容是这样的，为什么我在pdf总打开看不见", blueFont);
            section1.add(sectionContent);

            //将章节添加到文章中
            document.add(chapter1);

            //关闭文档
            document.close();
            //关闭书写器
            writer.close();
        }

        /**
         * 给PDF文件设置密码，需要引入bcprov-jdk15on.jar包：
         */
        static class demo7 {
            public static void main(String[] args) throws DocumentException, IOException {
                // 创建文件
                Document document = new Document();
                // 建立一个书写器
                PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C://Users/liudaka/Desktop/test7.pdf"));

                //用户密码
                String userPassword = "123456";
                //拥有者密码
                String ownerPassword = "hd";
                writer.setEncryption(userPassword.getBytes(), ownerPassword.getBytes(), PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);

                // 打开文件
                document.open();

                //添加内容
                document.add(new Paragraph("password !!!!"));

                // 关闭文档
                document.close();
                // 关闭书写器
                writer.close();
            }

            /**
             * 给PDF文件设置权限
             */
            static class demo8 {
                public static void main(String[] args) throws DocumentException, IOException {
                    // 创建文件
                    Document document = new Document();
                    // 建立一个书写器
                    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C://Users/liudaka/Desktop/test8.pdf"));

                    // 只读权限
                    writer.setEncryption("".getBytes(), "".getBytes(), PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);

                    // 打开文件
                    document.open();

                    // 添加内容
                    document.add(new Paragraph("password !!!!"));

                    // 关闭文档
                    document.close();
                    // 关闭书写器
                    writer.close();
                }
            }
        }

        /**
         * 读取/修改已有的PDF文件
         */
        static class demo9 {

            public static void main(String[] args) throws DocumentException, IOException {

                //读取pdf文件
                PdfReader pdfReader = new PdfReader("C://Users/liudaka/Desktop/test8.pdf");

                //修改器
                PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream("C://Users/liudaka/Desktop/test10.pdf"));

                Image image = Image.getInstance("C:/Users/H__D/Desktop/IMG_0109.JPG");
                image.scaleAbsolute(50, 50);
                image.setAbsolutePosition(0, 700);

                for (int i = 1; i <= pdfReader.getNumberOfPages(); i++) {
                    PdfContentByte content = pdfStamper.getUnderContent(i);
                    content.addImage(image);
                }

                pdfStamper.close();
            }
        }
    }

    static class demo11 {
        static class DocumentExample {
            public static void main(String[] args) {
                //创建文本
                Document document = new Document();
                try {
                    //写入文本到文件中
                    PdfWriter.getInstance(document, new FileOutputStream("C://Users/liudaka/Desktop/Paragraph.pdf"));
                    //打开文本
                    document.open();
                    //定义段落
                    Paragraph paragraph = new Paragraph();
                    //设置段落前后间距
                    paragraph.setSpacingAfter(25);
                    paragraph.setSpacingBefore(25);
                    //设置段段落居中
                    paragraph.setAlignment(Element.ALIGN_CENTER);
                    //设置缩进
                    paragraph.setIndentationLeft(50);
                    paragraph.setIndentationRight(50);

                    //插入十条文本块到段落中
                    int i = 0;
                    for (i = 0; i < 10; i++) {
                        Chunk chunk = new Chunk("This is a sentence which is long " + i + ". ");
                        paragraph.add(chunk);
                    }
                    //添加段落
                    document.add(paragraph);
                    //关闭文本
                    document.close();
                } catch (DocumentException e) {
                    e.printStackTrace();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }

    }
    /*static class demo9 {
        //@ApiOperation("生成pdf文件，response")//SUPPRESS
        @GetMapping(path = "/print/{idCard}")
        public Message test(@PathVariable String idCard, HttpServletResponse response) throws Exception {

           // PermanentResidentPopulation bean = permanentPersonService.findByIcCard(idCard);

            // 存储pdf 文件
            String pdfFolder = pdfLocation;
            File pdfFile = new File(pdfFolder);
            if (!pdfFile.exists()) {
                pdfFile.mkdir();
            }
            String pdf = pdfFolder + UUID.randomUUID() + ".pdf";

            // 1.新建documnet对象
            Document doc = new Document(PageSize.A4, 0, 0, 50, 0);//SUPPRESS
            FileOutputStream fos = new FileOutputStream(pdf);
            PdfWriter.getInstance(doc, fos);

            // 字体设置
            BaseFont baseFont = BaseFont.createFont(template + "simkai.ttf", BaseFont.IDENTITY_H, false);

            // 创建字体对象
            Font font = new Font(baseFont, 14, Font.NORMAL);//SUPPRESS
            Font font2 = new Font(baseFont, 21, Font.BOLD);//SUPPRESS

            *//**
     *  添加7列表格
     *//*
            PdfPTable table = new PdfPTable(6);//SUPPRESS

            // 设置各列列宽
            table.setTotalWidth(new float[]{130, 100, 100, 100, 100, 100});//SUPPRESS

            // 添加表格内容
            table.addCell(getPDFCell("户别", font));
//        PdfPCell pCell = mergeCol("常住人口登记表", font2, 3);
            PdfPCell pCell = new PdfPCell(new Paragraph("常住人口登记表", font2));
            pCell.setHorizontalAlignment(Element.ALIGN_CENTER);
            pCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            pCell.setRowspan(2);//SUPPRESS
            pCell.setColspan(3);//SUPPRESS
            pCell.setMinimumHeight(25);//SUPPRESS
            table.addCell(pCell);
            table.addCell(getPDFCell("户主姓名", font));
            table.addCell(getPDFCell("与户主关系", font));

            // 户别
            table.addCell(getPDFCell("", font));
            // 户主姓名
            table.addCell(getPDFCell(bean.getName(), font));
            // 与户主关系
            table.addCell(getPDFCell("", font));

            table.addCell(getPDFCell("姓名", font));
            table.addCell(mergeCol("", font, 3));//SUPPRESS
            table.addCell(getPDFCell("性别", font));
            // 性别
            table.addCell("");

            table.addCell(getPDFCell("曾用名", font));
            table.addCell(mergeCol("", font, 3));//SUPPRESS
            table.addCell(getPDFCell("民族", font));
            // 民族
            table.addCell("");

            table.addCell(getPDFCell("出生日期", font));
            // 出生日期
            table.addCell(mergeCol("", font, 5));//SUPPRESS

            // 监护人
            table.addCell(getPDFCell("监护人", font));
            // 监护关系
            table.addCell("");
            table.addCell("");
            table.addCell(getPDFCell("出生地", font));
            table.addCell(mergeCol("", font, 2));//SUPPRESS

            table.addCell(getPDFCell("住址", font));
            table.addCell(mergeCol("", font, 5));//SUPPRESS

            table.addCell(getPDFCell("本市（县）其他住址", font));
            table.addCell(mergeCol("", font, 5));//SUPPRESS

            table.addCell(getPDFCell("籍贯", font));
            table.addCell(mergeCol("", font, 3));//SUPPRESS
            table.addCell(getPDFCell("宗教信仰", font));
            table.addCell(getPDFCell("", font));

            table.addCell(getPDFCell("公民身份证编号", font));
            table.addCell(mergeCol("", font, 3));//SUPPRESS
            table.addCell(getPDFCell("居民身份证签发日期", font));
            table.addCell(getPDFCell("", font));

            table.addCell(getPDFCell("文化程度", font));
            table.addCell(getPDFCell("", font));
            table.addCell(getPDFCell("婚姻状况", font));
            table.addCell(getPDFCell("", font));
            table.addCell(getPDFCell("兵役状况", font));
            table.addCell(getPDFCell("", font));

            table.addCell(getPDFCell("身高", font));
            table.addCell(getPDFCell("", font));
            table.addCell(getPDFCell("血型", font));
            table.addCell(getPDFCell("", font));
            table.addCell(getPDFCell("职业", font));
            table.addCell(getPDFCell("", font));

            table.addCell(getPDFCell("服务处所", font));
            table.addCell(mergeCol("", font, 5));//SUPPRESS

            table.addCell(getPDFCell("何时何因何由何地迁来本市(县)", font));
            table.addCell(mergeCol("", font, 5));//SUPPRESS
            table.addCell(getPDFCell("何时何因由何地迁来本市(县)", font));
            table.addCell(mergeCol("", font, 5));//SUPPRESS
            table.addCell(getPDFCell("何时何因迁往何地", font));
            table.addCell(mergeCol("", font, 5));//SUPPRESS
            table.addCell(getPDFCell("何时何因注销户口", font));
            table.addCell(mergeCol("", font, 5));//SUPPRESS

            Paragraph end = new Paragraph("申报人签章");
            end.setAlignment(Paragraph.ALIGN_LEFT);

            Paragraph end2 = new Paragraph("申报人签章            加盖户口登记机关专用专用章", font);
            end2.setFirstLineIndent(90);//SUPPRESS

            Paragraph end3 = new Paragraph("申报人签章");
            end3.setPaddingTop(20);//SUPPRESS

            Paragraph end4 = new Paragraph("承办人签章            登记日期：  年  月  日", font);
            end4.setFirstLineIndent(90);//SUPPRESS

            doc.open();
            doc.add(table);
            doc.add(end);
            doc.add(end2);
            doc.add(end3);
            doc.add(end4);
            doc.close();

            String name = URLEncoder.encode("常住人口登记.pdf", "utf-8");
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/x-msdownload");
            response.addHeader("Content-Disposition", "attachment;filename*=utf-8'zh_cn'" + name);
            try (OutputStream out = response.getOutputStream()) {
                InputStream is = new FileInputStream(pdf);
                byte[] bys = new byte[1024];//SUPPRESS
                int len = 0;
                while ((len = is.read(bys)) != -1) {//SUPPRESS
                    out.write(bys, 0, len);//SUPPRESS
                }
                is.close();
            }

            return null;
        }
    }*/
}




